Dados Abertos - Senado Brasileiro, CEAPS¶

Os presentes dados estão disponíveis publicamente no site do governo brasileiro como parte da politica de acesso a dados públicos de forma aberta afim de ter-se transparência nos gastos públicos.

Senado.leg.br Site dos dados

Carregando módulos usados na análise.¶

Bibliotecas usadas para carregamentos dos dados, cálculos e renderização dos gráficos.

Incluem:

Numpy

Pandas

Matplotlib

Plotly - Visualização de dados

In [1]:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import plotly.express as px
import re
import csv
import glob
%matplotlib inline

pd.options.plotting.backend = "plotly"

Carregamento dos Dados¶

Sobre os Dados¶

Diversas inconsistências e dados faltantes em campos. Detalhes como datas e informação de documento faltando, ou data não preenchida ou preenchida de forma incompleta.

Ano de 2022¶

Amostra para o ano de 2022

In [2]:
# header=1 -> ignore first line header
df = pd.read_csv('data/despesa_ceaps_2022.csv', delimiter=';', header=1, encoding='iso-8859-1')
df.head()
Out[2]:
ANO MES SENADOR TIPO_DESPESA CNPJ_CPF FORNECEDOR DOCUMENTO DATA DETALHAMENTO VALOR_REEMBOLSADO COD_DOCUMENTO
0 2022 1 ACIR GURGACZ Aluguel de imóveis para escritório político, c... 004.948.028-63 GILBERTO PISELO DO NASCIMENTO 001/22 03/01/2022 Despesa com pagamento de aluguel de imóvel par... 6000 2173614
1 2022 1 ACIR GURGACZ Divulgação da atividade parlamentar 26.320.603/0001-64 INFORMANAHORA 000000000000310/A 04/01/2022 Despesa com divulgação da atividade parlamenta... 1500 2173615
2 2022 1 ACIR GURGACZ Divulgação da atividade parlamentar 13.659.201/0001-47 LINHA PURPURA FOTO E VIDEO LTDA 107 14/01/2022 Despesa com produção de texto e edição de víde... 6000 2173616
3 2022 1 ACIR GURGACZ Divulgação da atividade parlamentar 23.652.846/0001-01 ROBERTO GUTIERREZ DA ROCHA M.E.I. 187 18/01/2022 Divulgação da atividade parlamentar 1000 2173618
4 2022 1 ACIR GURGACZ Divulgação da atividade parlamentar 08.941.827/0001-01 RONDONIA DINÂMICA COM. E SERV. DE INFORMÁTICA ... 000000000001772/A 17/01/2022 Divulgação da atividade parlamentar 2000 2173617

Todos Anos 2008/2022¶

Carregando lista de arquivos contendo os dados para análise.

In [3]:
datas = {}
for file in sorted(glob.glob('data/*.csv')):
    
    if re.search(r'[0-9]+(.csv)', file):
        print('> load... ', file)
        datas[ re.search(r'[0-9]+', file ).group(0) ] = pd.read_csv(file, delimiter=';', header=1, encoding='iso-8859-1')
#(lambda d, x: [d.pop(i) for i in x] )(datas, ['2008','2009', '2010', '2011','2012'])
> load...  data/despesa_ceaps_2008.csv
> load...  data/despesa_ceaps_2009.csv
> load...  data/despesa_ceaps_2010.csv
> load...  data/despesa_ceaps_2011.csv
> load...  data/despesa_ceaps_2012.csv
> load...  data/despesa_ceaps_2013.csv
> load...  data/despesa_ceaps_2014.csv
> load...  data/despesa_ceaps_2015.csv
> load...  data/despesa_ceaps_2016.csv
> load...  data/despesa_ceaps_2017.csv
> load...  data/despesa_ceaps_2018.csv
> load...  data/despesa_ceaps_2019.csv
> load...  data/despesa_ceaps_2020.csv
> load...  data/despesa_ceaps_2021.csv
> load...  data/despesa_ceaps_2022.csv

Pré-Processamento dos Dados¶

Concatenando as tabelas de dados para formar um único da dataframe com os dados para análise.

In [4]:
dff = pd.concat(datas, ignore_index=True)
In [5]:
dff.loc[0:dff.shape[0],'VALOR_REEMBOLSADO'].replace(r'(\s)', '', regex=True, inplace=True)
dff.loc[0:dff.shape[0],'VALOR_REEMBOLSADO'].replace(r'(\n)','', regex=True, inplace=True)
dff.loc[0:dff.shape[0], 'VALOR_REEMBOLSADO'].replace(r'(\r)', '', regex=True, inplace=True)
dff.head()
Out[5]:
ANO MES SENADOR TIPO_DESPESA CNPJ_CPF FORNECEDOR DOCUMENTO DATA DETALHAMENTO VALOR_REEMBOLSADO COD_DOCUMENTO
0 2008 9 ADA MELLO Contratação de consultorias, assessorias, pesq... NaN NaN NaN NaN NaN 12351,52 2.008091e+12
1 2008 9 ADA MELLO Locomoção, hospedagem, alimentação, combustíve... NaN NaN NaN NaN NaN 386,6 2.008091e+12
2 2008 10 ADA MELLO Contratação de consultorias, assessorias, pesq... NaN NaN NaN NaN NaN 12351,52 2.008101e+12
3 2008 10 ADA MELLO Locomoção, hospedagem, alimentação, combustíve... NaN NaN NaN NaN NaN 2610,68 2.008101e+12
4 2008 11 ADA MELLO Contratação de consultorias, assessorias, pesq... NaN NaN NaN NaN NaN 12351,52 2.008111e+12
In [6]:
dff.loc[0:,'VALOR_REEMBOLSADO'].replace( regex=r'(,)', value='.',  inplace=True )
#dff.loc[0:dff.shape[0],'VALOR_REEMBOLSADO'] =dff.loc[0:dff.shape[0],'VALOR_REEMBOLSADO'].replace( regex={r'(,)':'.'} )
#dfs['VALOR_REEMBOLSADO'] = pd.to_numeric(dff['VALOR_REEMBOLSADO'], downcast='float')
dff.head()
Out[6]:
ANO MES SENADOR TIPO_DESPESA CNPJ_CPF FORNECEDOR DOCUMENTO DATA DETALHAMENTO VALOR_REEMBOLSADO COD_DOCUMENTO
0 2008 9 ADA MELLO Contratação de consultorias, assessorias, pesq... NaN NaN NaN NaN NaN 12351.52 2.008091e+12
1 2008 9 ADA MELLO Locomoção, hospedagem, alimentação, combustíve... NaN NaN NaN NaN NaN 386.6 2.008091e+12
2 2008 10 ADA MELLO Contratação de consultorias, assessorias, pesq... NaN NaN NaN NaN NaN 12351.52 2.008101e+12
3 2008 10 ADA MELLO Locomoção, hospedagem, alimentação, combustíve... NaN NaN NaN NaN NaN 2610.68 2.008101e+12
4 2008 11 ADA MELLO Contratação de consultorias, assessorias, pesq... NaN NaN NaN NaN NaN 12351.52 2.008111e+12
In [7]:
dff.loc[0:, 'VALOR_REEMBOLSADO'] = pd.to_numeric(dff.loc[0:,'VALOR_REEMBOLSADO'], downcast='float')
#dff.dropna(inplace=True)
#dff.to_csv('data.csv', index=False)
/tmp/ipykernel_34592/1191592795.py:1: FutureWarning: In a future version, `df.iloc[:, i] = newvals` will attempt to set the values inplace instead of always setting a new array. To retain the old behavior, use either `df[df.columns[i]] = newvals` or, if columns are non-unique, `df.isetitem(i, newvals)`
  dff.loc[0:, 'VALOR_REEMBOLSADO'] = pd.to_numeric(dff.loc[0:,'VALOR_REEMBOLSADO'], downcast='float')

Tratamento e Limpeza dos Dados (Data Wrangling)¶

No campo 'VALOR_REEMBOLSADO' trocar virgula por ponto e converter para tipo numérico (float).

In [8]:
df['VALOR_REEMBOLSADO'] = pd.to_numeric( df['VALOR_REEMBOLSADO'].replace(regex=r'(,)', value='.'), downcast='float')
In [9]:
df.head()
Out[9]:
ANO MES SENADOR TIPO_DESPESA CNPJ_CPF FORNECEDOR DOCUMENTO DATA DETALHAMENTO VALOR_REEMBOLSADO COD_DOCUMENTO
0 2022 1 ACIR GURGACZ Aluguel de imóveis para escritório político, c... 004.948.028-63 GILBERTO PISELO DO NASCIMENTO 001/22 03/01/2022 Despesa com pagamento de aluguel de imóvel par... 6000.0 2173614
1 2022 1 ACIR GURGACZ Divulgação da atividade parlamentar 26.320.603/0001-64 INFORMANAHORA 000000000000310/A 04/01/2022 Despesa com divulgação da atividade parlamenta... 1500.0 2173615
2 2022 1 ACIR GURGACZ Divulgação da atividade parlamentar 13.659.201/0001-47 LINHA PURPURA FOTO E VIDEO LTDA 107 14/01/2022 Despesa com produção de texto e edição de víde... 6000.0 2173616
3 2022 1 ACIR GURGACZ Divulgação da atividade parlamentar 23.652.846/0001-01 ROBERTO GUTIERREZ DA ROCHA M.E.I. 187 18/01/2022 Divulgação da atividade parlamentar 1000.0 2173618
4 2022 1 ACIR GURGACZ Divulgação da atividade parlamentar 08.941.827/0001-01 RONDONIA DINÂMICA COM. E SERV. DE INFORMÁTICA ... 000000000001772/A 17/01/2022 Divulgação da atividade parlamentar 2000.0 2173617

Converter campo 'DATA' do tipo string para tipo Date. Campos de data não preenchidos ou preenchidos em formato incorreto será ignorados mantendo conteúdo antigo sem ser convertido para o tipo "datetime" do Python.

In [10]:
# Converter DATA para tipo Date
df['DATA'] = pd.to_datetime(df['DATA'], dayfirst=True, errors='ignore')

Tabela dos Dados Pré-processada e Tratada¶

In [11]:
df
Out[11]:
ANO MES SENADOR TIPO_DESPESA CNPJ_CPF FORNECEDOR DOCUMENTO DATA DETALHAMENTO VALOR_REEMBOLSADO COD_DOCUMENTO
0 2022 1 ACIR GURGACZ Aluguel de imóveis para escritório político, c... 004.948.028-63 GILBERTO PISELO DO NASCIMENTO 001/22 2022-01-03 Despesa com pagamento de aluguel de imóvel par... 6000.00 2173614
1 2022 1 ACIR GURGACZ Divulgação da atividade parlamentar 26.320.603/0001-64 INFORMANAHORA 000000000000310/A 2022-01-04 Despesa com divulgação da atividade parlamenta... 1500.00 2173615
2 2022 1 ACIR GURGACZ Divulgação da atividade parlamentar 13.659.201/0001-47 LINHA PURPURA FOTO E VIDEO LTDA 107 2022-01-14 Despesa com produção de texto e edição de víde... 6000.00 2173616
3 2022 1 ACIR GURGACZ Divulgação da atividade parlamentar 23.652.846/0001-01 ROBERTO GUTIERREZ DA ROCHA M.E.I. 187 2022-01-18 Divulgação da atividade parlamentar 1000.00 2173618
4 2022 1 ACIR GURGACZ Divulgação da atividade parlamentar 08.941.827/0001-01 RONDONIA DINÂMICA COM. E SERV. DE INFORMÁTICA ... 000000000001772/A 2022-01-17 Divulgação da atividade parlamentar 2000.00 2173617
... ... ... ... ... ... ... ... ... ... ... ...
16593 2022 12 ZEQUINHA MARINHO Passagens aéreas, aquáticas e terrestres nacio... 22.052.777/0001-32 Exceller Tour WIXHAI 2022-12-06 Companhia Aérea: LATAM, Localizador: WIXHAI. P... 2893.04 2191398
16594 2022 12 ZEQUINHA MARINHO Passagens aéreas, aquáticas e terrestres nacio... 22.052.777/0001-32 Exceller Tour WITOLM 2022-12-09 Companhia Aérea: GOL, Localizador: WITOLM. Pas... 1180.19 2192272
16595 2022 12 ZEQUINHA MARINHO Passagens aéreas, aquáticas e terrestres nacio... 22.052.777/0001-32 Exceller Tour THPKVQ 2022-12-20 Companhia Aérea: TAM, Localizador: THPKVQ. Pas... 2671.90 2192274
16596 2022 12 ZEQUINHA MARINHO Passagens aéreas, aquáticas e terrestres nacio... 22.052.777/0001-32 Exceller Tour QNN9HX 2022-12-21 Companhia Aérea: AZUL, Localizador: QNN9HX. Pa... 1334.31 2192244
16597 2022 12 ZEQUINHA MARINHO Passagens aéreas, aquáticas e terrestres nacio... 22.052.777/0001-32 Exceller Tour WMQWBX 2022-12-30 Companhia Aérea: TAM, Localizador: WMQWBX. Pas... 2250.72 2193622

16598 rows × 11 columns

Gastos Para o Ano de 2022¶

In [12]:
senadores = df['SENADOR'].unique()
df_gastos_sn = { 'Senador':[], 'GastoAnual':[], 'RegsSemDocumento':[], 'RegsSemDetalhamentoDoGasto':[] }
In [13]:
for i in senadores:
    df_gastos_sn['Senador'].append(i)
    df_gastos_sn['GastoAnual'].append( df[ df['SENADOR'] == i ]['VALOR_REEMBOLSADO'].sum() )
    df_gastos_sn['RegsSemDocumento'].append( df[ df['DOCUMENTO'].isna() == True][df['SENADOR'] == i ].isna().sum()['DOCUMENTO'] )
    df_gastos_sn['RegsSemDetalhamentoDoGasto'].append( df[ df['DETALHAMENTO'].isna() == True][df['SENADOR'] == i ].isna().sum()['DETALHAMENTO'] )
/tmp/ipykernel_34592/4245188335.py:4: UserWarning: Boolean Series key will be reindexed to match DataFrame index.
  df_gastos_sn['RegsSemDocumento'].append( df[ df['DOCUMENTO'].isna() == True][df['SENADOR'] == i ].isna().sum()['DOCUMENTO'] )
/tmp/ipykernel_34592/4245188335.py:5: UserWarning: Boolean Series key will be reindexed to match DataFrame index.
  df_gastos_sn['RegsSemDetalhamentoDoGasto'].append( df[ df['DETALHAMENTO'].isna() == True][df['SENADOR'] == i ].isna().sum()['DETALHAMENTO'] )
In [14]:
#ds = pd.DataFrame( { 'Senador': df_gastos_sn['Senador'], 'Gastos': df_gastos_sn['GastoAnual'] })
ds = pd.DataFrame( df_gastos_sn )
ds = ds.sort_values(by=['GastoAnual'], ascending=False)
ds
Out[14]:
Senador GastoAnual RegsSemDocumento RegsSemDetalhamentoDoGasto
50 LUCAS BARRETO 511319.78 0.0 228.0
90 TELMÁRIO MOTA 488693.40 0.0 249.0
64 MECIAS DE JESUS 488586.66 0.0 127.0
68 OMAR AZIZ 487541.24 0.0 0.0
9 CHICO RODRIGUES 486958.05 0.0 72.0
... ... ... ... ...
5 ANTONIO ANASTASIA 19647.13 3.0 15.0
33 GUARACY SILVEIRA 19285.82 0.0 1.0
49 LEILA BARROS 10567.64 12.0 12.0
63 MARIA ELIZA DE AGUIAR E SILVA 10136.42 0.0 0.0
84 SAMUEL ARAUJO 3233.90 0.0 0.0

97 rows × 4 columns

10 Senadores com Maior Gastos 2022¶

In [15]:
ds[:10].plot(x='Senador', y='GastoAnual', title='Gastos (R$) Senadores Brasileiros 2022', kind='bar')

10 Senadores com mais ocorrência de falta de Documento comprobatório do gasto na Base de Dados¶

In [16]:
ds.sort_values(by=['RegsSemDocumento'], ascending=False)[:10].plot(x='Senador', y='RegsSemDocumento', title='10 Sen. Sem Documento de Registro do Gasto', kind='bar')
In [17]:
# Número de campos não preenchidos para senadora 'Zenaide Maia'. Neste trecho é possível contar quantos senadores não
# preencheram o campo para o documento do gasto declarado.
#df[ df['DOCUMENTO'].isna() == True][df['SENADOR'] == 'ZENAIDE MAIA'].isna().sum()
In [18]:
# Plotly geneate fle to graphics host
#import plotly.io as pio
#fig_a = ds[:10].plot(x='Senador', y='GastoAnual', title='Gastos (R$) Senadores Brasileiros 2022', kind='bar')
#fig_b = ds.sort_values(by=['RegsSemDocumento'], ascending=False)[:10].plot(x='Senador', y='RegsSemDocumento', title='10 Sen. Sem Documento de Registro do Gasto', kind='bar')
#pio.write_html(fig_a, file='figa.html', auto_open=True)
#pio.write_html(fig_b, file='figb.html', auto_open=True)
In [ ]: